// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.chat_friend.gift;

import android.app.Activity;
import android.view.View;

import com.eva.android.widget.SimpleGridView;
import com.eva.android.widget.SimpleGridView.DefaultElementDTO;
import com.eva.android.widget.SimpleGridView.DefaultItemAction;
import com.eva.android.widget.SimpleViewPager;
import com.eva.epc.common.util.CommonUtils;
import com.eva.epc.common.util.MapNoHash;
import com.x52im.rbchat.Const;
import com.x52im.rbchat.R;
import com.x52im.rbchat.logic.chat_friend.gift.model.Gift;
import com.x52im.rbchat.logic.chat_friend.gift.model.GiftsMeta;

import java.util.ArrayList;

/**
 * 礼品工具界面：可重用根界面.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @since 2.5
 */
public abstract class GiftsPagerForRoot extends SimpleViewPager
{
	protected String parentFriendUID = null;
	protected Activity parentActivity = null;
	
	public GiftsPagerForRoot(final Activity context, String friendUID
			, int main_layout_res_id, int indicator_parent_res_id, int pager_res_id)
	{
		super(context
				, main_layout_res_id
				, indicator_parent_res_id
				, pager_res_id);
		
		// 
		this.parentActivity = context;
		this.parentFriendUID = friendUID;
	}
	
	/**
	 * 用新场景数据刷新界面显示的核心实现方法.
	 * 
	 * @param context
	 * @param scenceMeta
	 * @see #putDatas(ArrayList, ArrayList)
	 */
	public void refreshUI(Activity context, GiftsMeta scenceMeta)
	{
		// 每页显示的礼品数
		int num_per_page = Const.GIFTS_TOOLS_PAGER_EVERY_PAGE_NUM;

		// 要显示的所有礼品集合
		ArrayList<DefaultElementDTO> listDatas = getListDatas(context, scenceMeta);

		// 提交新数据并刷新ui显示
		this.putDatas(getViews(context, listDatas, num_per_page), getPagerIndicators(context, listDatas.size(), num_per_page));
	}

	// 返回的界面上的页面ui集合
	protected ArrayList<View> getViews(Activity context, ArrayList<DefaultElementDTO> listDatas, int num_per_page)
	{
		ArrayList<View> views = new ArrayList<View>();
		
		// 遍历所有元素（并自动按定义的每页显示数进行分页）
		ArrayList<DefaultElementDTO> childListDatas = null;
		for(int i = 0; i < listDatas.size();i++)
		{
			// 当整页时，进行分页处理
			if(i % num_per_page == 0)
			{
				// 当childListDatas == null时是i==0时的特殊情况，注意一下！
				if(childListDatas != null)
					views.add(createGridViewObj(context, childListDatas));
				
				childListDatas = new ArrayList<DefaultElementDTO>();
			}
			childListDatas.add(listDatas.get(i));
			
			// 特殊情况处理：上述算法中最后一页是无法加入到views中的，所以要特殊处理哦
			if(i == (listDatas.size() - 1))
				views.add(createGridViewObj(context, childListDatas));
		}
		return views;
	}
	
	// 根据传进来的每页元素数据集，生成该页的GridView对象
	protected abstract SimpleGridView createGridViewObj(Activity context, ArrayList<DefaultElementDTO> childListDatas);

	// 返回界面上的指示器ui组件
	protected ArrayList<PaggerIndicator> getPagerIndicators(final Activity context, int allFaceCount, int num_per_page)
	{
		ArrayList<PaggerIndicator> ids = new ArrayList<PaggerIndicator>();
		
		// 指示器个数 = 无条件进位【总表情集数 / 每页数】的结果（即2.1=3页，2=2页，2.9=3页）
		int indicatorCount = CommonUtils.getLikePageNum(allFaceCount, num_per_page);
		
		// 按个数建立指示器ui组件
		for(int i = 0; i < indicatorCount; i++)
			ids.add(new DefaultPaggerIndicatorImageView(context){
				public void setIndicatorSelected(boolean selected)
				{
					if(selected)
						this.setImageResource(R.drawable.chatting_morefunc_pager_indicator_selected_icon);
					else
						this.setImageResource(R.drawable.chatting_morefunc_pager_indicator_unselected_icon);
				}
			});

		return ids;
	}

	// 返回所有元素的数据集
	protected ArrayList<DefaultElementDTO> getListDatas(final Activity context, GiftsMeta scenceMeta)
	{
		// 要返回的所有元素列表
		ArrayList<DefaultElementDTO> listDatas = new ArrayList<DefaultElementDTO>();
		
		// 遍历表情集元始数据模型
		MapNoHash<String, Gift> facesMap = scenceMeta.getGiftsData();
		for(String key : facesMap.keys())
		{
			Gift g = facesMap.get(key);
			listDatas.add(new DefaultElementDTO(createAction(context, g), g.getGift_name() , null));
		}
		
		return listDatas;
	}
	
	/**
	 * 表情发送成功后的处理.
	 * 
	 * <p>
	 * 通常情景下，表情发送成功后，会在聊天界面上加入一条本地发出的消息，用于
	 * 告之本地用户该表情已发出.
	 * 
//	 * @param sm 发送的表情所对应的角色数据模型引用，但此处不保证sm!=null
	 * @param faceIdentId 表情标识id
	 */
	protected void faceSendOver(//GiftsMeta sm, 
			Gift faceIdentId)
	{
		// default do nothing
	}
	
	protected DefaultItemAction createAction(final Activity context, Object indentId)
	{
		return new DefaultItemAction(indentId){
			@Override
			public void actionPerformed(Object obj)
			{
//				WidgetUtils.showToast(context, "选中的obj="+obj);
				if(obj != null && obj instanceof Gift)
				{
					// 表情的id（一个表情是一个文件夹，表情的id就是文件夹名）
					final Gift faceIdentId = (Gift)obj;
					//
					fireAction(faceIdentId);
				}
			}
		};
	}
	
	protected abstract void fireAction(Gift faceIdentId);
}

